/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package otcapp.experto;

import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.hibernate.Criteria;
import org.hibernate.criterion.Restrictions;
import otcapp.dto.ResolucionDTO;
import otcapp.dto.SupervisionDTO;
import otcapp.entidades.Pieza;
import otcapp.entidades.Resolucion;
import otcapp.entidades.Supervision;
import otcapp.experto.excepciones.ExpertoSupervisionesException;
import otcapp.fabricas.FabricaExpertos;
import persistencia.exceptions.ExcepcionFachada;
import persistencia.Fachada;

/**
 *
 * @author diego
 */
public class ExpertoSupervisiones extends Experto {

    ExpertoConsultarPieza consultarPieza = (ExpertoConsultarPieza) FabricaExpertos.getInstancia().getExperto(FabricaExpertos.expertos.CONSULTAR_PIEZA);

    public void crearNuevaSupervision(SupervisionDTO dtoSupervision) throws ExpertoSupervisionesException {

        validarDatosSupervision(dtoSupervision);

        desactivarSupervisionesAnterioresPieza(dtoSupervision.getResolucion().getId());

        Supervision nuevaSupervision = new Supervision();

        nuevaSupervision.setActiva(true);
        nuevaSupervision.setControl(dtoSupervision.getFrecuenciaControl());
        nuevaSupervision.setFechaSupervision(dtoSupervision.getFechaSupervision());
        nuevaSupervision.setLugar(dtoSupervision.getDomicilioSupervision());
        nuevaSupervision.setResolucionSupervisada((Resolucion) consultarPieza.buscarPiezaID(dtoSupervision.getResolucion().getId()));
        nuevaSupervision.setSupervisor(dtoSupervision.getAsistenteSocial());
        try {
            Fachada.getInstancia().guardar(nuevaSupervision);
        } catch (ExcepcionFachada ex) {
            throw new ExpertoSupervisionesException("Error al guardar nueva supervision\n" + ex.getMessage());
        }

    }

    private void validarDatosSupervision(SupervisionDTO dtoSupervision) throws ExpertoSupervisionesException {
        Criteria criterio = Fachada.getInstancia().crearCriterio(Supervision.class).createCriteria("resolucionSupervisada").add(Restrictions.eq("id", dtoSupervision.getResolucion().getId()));
        List<Supervision> supervisiones = Fachada.getInstancia().buscar(Supervision.class, criterio);
        for (Supervision supervision : supervisiones) {
            if (supervision.isActiva()) {
                if (supervision.getSupervisor().getId().equals(dtoSupervision.getAsistenteSocial().getId())) {
                    throw new ExpertoSupervisionesException(dtoSupervision.getAsistenteSocial().getApellidoNombre() + " ya se encuentra supervisando la pieza seleccionada");
                }
            }
        }
    }

    private void desactivarSupervisionesAnterioresPieza(Long resolucionID) throws ExpertoSupervisionesException {
        Criteria criterio = Fachada.getInstancia().crearCriterio(Supervision.class).createCriteria("resolucionSupervisada").add(Restrictions.eq("id", resolucionID));
        List<Supervision> supervisiones = Fachada.getInstancia().buscar(Supervision.class, criterio);
        if (!supervisiones.isEmpty()) {
            for (Supervision supervision : supervisiones) {
                if (supervision.isActiva()) {
                    supervision.setActiva(false);
                    try {
                        Fachada.getInstancia().guardar(supervision);
                    } catch (ExcepcionFachada ex) {
                        throw new ExpertoSupervisionesException("Error al desactivar supervisiones anteriores");
                    }
                }
            }
        }
    }

    public List getSupervisionesAnterioresPiezaID(Long idPieza) {

        Criteria criterio = Fachada.getInstancia().crearCriterio(Supervision.class).createCriteria("resolucionSupervisada").add(Restrictions.eq("id", idPieza));
        List<Supervision> supervisiones = Fachada.getInstancia().buscar(Supervision.class, criterio);
        List<SupervisionDTO> supervisionesDTO = new ArrayList<>();
        for (Supervision supervision : supervisiones) {
            if (supervision.isActiva()) {
                continue;
            }
            SupervisionDTO dto = new SupervisionDTO();
            dto.setAsistenteSocial(supervision.getSupervisor());
            dto.setDomicilioSupervision(supervision.getLugar());
            dto.setFechaSupervision(supervision.getFechaSupervision());
            dto.setFrecuenciaControl(supervision.getControl());
            dto.setResolucion((ResolucionDTO) consultarPieza.crearPiezaDTO((Pieza) supervision.getResolucionSupervisada()));
            if (supervision.isResultadoPositivo()) {
                dto.setResultado("Positivo");
            } else {
                dto.setResultado("Negativo");
            }
            supervisionesDTO.add(dto);
        }
        return supervisionesDTO;
    }
}
